
#include <stdio.h>
#include <sys/types.h>		//	open 依赖头文件
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>         //  close 依赖头文件
#include <stdlib.h>
#include "my_codeh/event.h"          //  自定义触摸屏头文件
#include "my_codeh/block.h"
#include <linux/input.h>    //  struct input_event 依赖头文件
extern int blocks[ROW][LINE];
int event_fd = -1;          //  只在本文件中使用,以全局变量形式保存

/*
    event_init:     触摸屏初始化
    retval:         成功返回 0
                    失败返回 -1
*/
int event_init()
{
    event_fd = open(EVENT_PATH,O_RDONLY);          //  只读打开 触摸屏文件
    if(event_fd == -1)                            //  打开错误
    {
        perror("open event0 error");        //  解析错误
        return -1;
    }
    return 0;
}

/*
    event_uninit:   触摸屏解初始化
*/
void event_uninit()
{
    close(event_fd);
}


/*
    get_event:  获取触摸屏操作(点击/滑动)
    retval:     成员变量 way == OTH,表示为点击;否则为 滑动
*/
EVENT get_event()
{
    //  1、获取到两个坐标
    EVENT p1 = {OTH,-1,-1};          //  保存进入坐标
    EVENT p2 = {OTH,-1,-1};          //  保存离开坐标
    while(1)
    {        
        struct input_event ev;              //  读取到的数据
        int r = read(event_fd,&ev,sizeof(ev));    //  读取
        if(r == -1)                         //  读取出错
        {
            perror("read error");           //  解析错误
            break;
        }
        if(ev.type == EV_ABS && ev.code == ABS_X)       //  X 轴
        {  
            if(p1.x == -1)                              //  自身作为标志位,仅做一次操作
            {
                p1.x = ev.value;                        //  更新坐标     
            } 
            p2.x = ev.value;                            //  更新坐标
        }
        else if(ev.type == EV_ABS && ev.code == ABS_Y)  //  Y 轴
        {   
            if(p1.y == -1)                              //  自身作为标志位,仅做一次操作
            {
                p1.y = ev.value;                        //  更新坐标     
            } 
            p2.y = ev.value;                            //  更新坐标
        } 
        else if(ev.type == EV_KEY && ev.code == BTN_TOUCH && ev.value == 0)     //  离开触摸屏
        {
            break;
        }
    }
    
    //  2、解析并判断操作情况 点击/滑动
     //认为操作在某个范围为点击    △x <= 50 && △y <= 50
    if(p2.x == -1 || p2.y == -1)    //  人为认为是点击
    {
        p2 = p1;
    }
    // if(abs(p2.x - p1.x) <= 50 && abs(p2.y - p1.y) <= 50)    //  点击事件
    // {
    //     return p2;                  //  way == OTH,为点击
    // }
    int touch_x = p2.x;
    int touch_y = p2.y;//把触摸的坐标进行转换成可以用来判断的方块位置，从而方便lcd函数编写出数组为1的方块变成黑色的函数
    if(touch_x >128)//这里是把两边都做了一个界限处理，只有中心区域作为游戏区域
    {
        int Line = (touch_x-128)/153;//根据触摸板的触摸坐标做一下换算，把原本的1024 变成了 128  153  153 153 153 153   128 每一个153 就都变成了一个有效的触摸区域
        int Row = touch_y/100;//同样y轴也是同样的处理，分为六块
        if(Line==LINE||Row<0||Row>LINE)//                       此时line 为 0 1 2 3 4   成功把具体的坐标点转换成了5x6的30块区域
        {//                                                       row为0
            p2.way = MISS;//                                           1
            return p2;//                                               2
        }//                                                            3
        else if(blocks[Row][Line]==1)//                                4
        {//                                                            5
            p2.way = HIT;
            blocks[Row][Line]=2;//当通过add_init 获得的包含一个随机可能出现的数的一行，由于通过赋0 和 1 作为判断标准，当触摸判定到为1的区域，则说明此时这块为黑色，
            return p2;//而如果触摸到了，则代表击中了有效黑块，游戏需要继续
        }
        else if(blocks[Row][Line]==0)
        {
            p2.way = UNHIT;//如果击中的是为0的白色方块，则说明游戏结束了

            return p2;
        }
        else if(blocks[Row][Line]==2)//这里是为了将击中的黑块 通过lcd函数处理变成灰块，要先将击中的黑块的数组信息变成2，而所有为2 的区域都会被lcd 显示为灰色
        {
            p2.way = MISS;//击中灰块则不会发生变化，相当于击中边界
            return p2;
        }
    }
    else
    {
        printf("第一排出界\n");//其余区域就无所谓了
    }
}

EVENT get_event1()
{
    //  1、获取到两个坐标
    EVENT p1 = {OTH,-1,-1};          //  保存进入坐标
    EVENT p2 = {OTH,-1,-1};          //  保存离开坐标
    while(1)
    {        
        struct input_event ev1;              //  读取到的数据
        int r = read(event_fd,&ev1,sizeof(ev1));    //  读取
        if(r == -1)                         //  读取出错
        {
            perror("read error");           //  解析错误
            break;
        }
        if(ev1.type == EV_ABS && ev1.code == ABS_X)       //  X 轴
        {  
            if(p1.x == -1)                              //  自身作为标志位,仅做一次操作
            {
                p1.x = ev1.value;                        //  更新坐标     
            } 
            p2.x = ev1.value;                            //  更新坐标
        }
        else if(ev1.type == EV_ABS && ev1.code == ABS_Y)  //  Y 轴
        {   
            if(p1.y == -1)                              //  自身作为标志位,仅做一次操作
            {
                p1.y = ev1.value;                        //  更新坐标     
            } 
            p2.y = ev1.value;                            //  更新坐标
        } 
        else if(ev1.type == EV_KEY && ev1.code == BTN_TOUCH && ev1.value == 0)     //  离开触摸屏
        {
            break;
        }
    }
    //  2、解析并判断操作情况 点击/滑动
     //认为操作在某个范围为点击    △x <= 50 && △y <= 50
    if(p2.x == -1 || p2.y == -1)    //  人为认为是点击
    {
        p2 = p1;
    }
    if(p2.x>10&&p2.x<90&&p2.y<110&&p2.y>10)//左上角区域，也就是用来重新开始的选项
    {   
        p2.way = HIT;
        return p2;
    }
    else if(p2.x>934&&p2.x<1014&&p2.y<90&&p2.y>10)//右上角区域，也就是结束游戏的选项
    {
        p2.way = UNHIT;
        return p2;
    }
    else if(p2.x>934&&p2.x<1014&&p2.y<420&&p2.y>340)//右下角上部，用来增加难度区域
    {
        p2.way = UP;
        return p2;
    }
    else if(p2.x>934&&p2.x<1014&&p2.y<590&&p2.y>510)//右下角下部，用来减低难度区域
    {
       p2.way = DOWN;
        return p2; 
    }
    
}



    



